use parking_lot::{Mutex, Condvar};

use std::sync::Arc;
use std::thread;
use std::time::Duration;

fn main() {
    let pair = Arc::new((Mutex::new(false) , Condvar::new())) ;
    let pair2 = pair.clone() ; 
    // 主线程和waiter线程都需要访问这个元组  但是所有权系统要求任何时刻只能有一个所有者
    // Arc的clone创建共享所有权
    
    // 原理 pair.clone创建了新的Arc指向相同的数据
    // 原始的pair保留在主线程  克隆的pair2移动到了waiter线程
    // 两个Arc实例共同维护一份引用数据

    // 所谓&* 是一种惯用写法 先*对Arc解引用  然后&对元组得到不可变引用
    
    let waiter = thread::spawn(move || {
        let (lock, cvar) = &*pair2; 
        let mut ready = lock.lock();
        while !*ready { 
            cvar.wait(&mut ready);
        }
        println!("条件ok~ 继续") ;
    }) ; 
    
    thread::sleep(Duration::from_millis(1000));
    let (lock , cvar) = &*pair;
    *lock.lock() = true;
    cvar.notify_one();
    
    waiter.join().unwrap();
}


